﻿using System;
using System.ComponentModel;

namespace ProtoBuf
{
  /// <summary>Specifies a method on the root-contract in an hierarchy to be invoked before serialization.</summary>
  [AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = false)]
#if !CF && !SILVERLIGHT && !MONODROID && !WINRT && !IOS && !PORTABLE && !DNXCORE50
  [ImmutableObject(true)]
#endif
  public sealed class ProtoBeforeSerializationAttribute : Attribute { }

  /// <summary>Specifies a method on the root-contract in an hierarchy to be invoked after serialization.</summary>
  [AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = false)]
#if !CF && !SILVERLIGHT && !MONODROID && !WINRT && !IOS && !PORTABLE && !DNXCORE50
  [ImmutableObject(true)]
#endif
  public sealed class ProtoAfterSerializationAttribute : Attribute { }

  /// <summary>Specifies a method on the root-contract in an hierarchy to be invoked before deserialization.</summary>
  [AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = false)]
#if !CF && !SILVERLIGHT && !MONODROID && !WINRT && !IOS && !PORTABLE && !DNXCORE50
  [ImmutableObject(true)]
#endif
  public sealed class ProtoBeforeDeserializationAttribute : Attribute { }

  /// <summary>Specifies a method on the root-contract in an hierarchy to be invoked after deserialization.</summary>
  [AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = false)]
#if !CF && !SILVERLIGHT && !MONODROID && !WINRT && !IOS && !PORTABLE && !DNXCORE50
  [ImmutableObject(true)]
#endif
  public sealed class ProtoAfterDeserializationAttribute : Attribute { }
}
